#ifndef __MOD_FORWARD_SERVER_H__
#define __MOD_FORWARD_SERVER_H__

#include <stdint.h>
#include <string.h>
//#include "config.h"
//#include "SocketConfig.h"
#include "Drv_W5500.h"
#include "net_config.h"
#include "socket_config.h"
#include "uart_config.h"
#include "BSP_Uart.h"
#include "../Common/Circle_buffer.h"


#define DEBUG_UART_INDEX 0
#define UART_DMA_RX_LEN 128      //串口DMA通讯接受数据长度
#define UART_CIRCLE_BUF_LEN 64  //串口环形缓冲区缓存大小

#define SOCKET_PORT_NUM 6
#define BUF_SIZE 2048  

#define SOCK_RECONNECT_TIMEOUT 5000   //  5s检测socket状态

class cForwardServer
{
public:
	  cForwardServer();
    ~cForwardServer(){}
			
    void Init(void);               // 初始化整个转发模块
    void InitNet(void);            // 初始化网络部分
		//void SetNetConfig();           // 设置网络参数
    //void InitSocket(void);         // 初始化 Socket 参数
	  //void SetUartCongih(); 
    void InitUart(void);           // 初始化串口
    void InitCircleBuf(void);      // 初始化接收缓冲区
    void Process(void);
		void TCPToUart(void);	
		void UartToTCP(void);
	  void HeartToSocket(void);
			
		friend void UartRxCplCallback(struct _Uart_TypeDef *pst_UartStruct, uint16_t uin_Size);
		friend void UartTxCplCallback(struct _Uart_TypeDef *pst_UartStruct);
    friend void UartErrorCallback(struct _Uart_TypeDef *pst_UartStruct);

		private:
    W5500_TypeDef* pst_W5500Struct;          // W5500 参数结构体指针数组
    Uart_TypeDef*  pUartDevice[UART_PORT_NUM];  // 串口结构体指针数组

    uint8_t    UartRxDMABuf[UART_PORT_NUM][UART_DMA_RX_LEN];     // DMA接受缓冲区
    circle_buf UartRxBufCtrl[UART_PORT_NUM];                     // 控制结构体
    uint8_t    UartRxBufMem[UART_PORT_NUM][UART_CIRCLE_BUF_LEN]; // 实际底层内存

    uint8_t    auch_SocketTxBuff[UART_PORT_NUM][BUF_SIZE];        //socket发送缓冲区--对应串口号(1-6)
    uint16_t   uin_SocketTxSize[UART_PORT_NUM];                   //socket发送字节数


    Uart_TypeDef* pSocketToUartMap[SOCKET_PORT_NUM];      // socket 对应的 UART
    uint8_t    auch_SocketRxBuff[SOCKET_PORT_NUM][BUF_SIZE];      //socket接受缓冲区--对应socketport(0-5)
		uint16_t   uin_SocketRxSize[SOCKET_PORT_NUM];                   //socket接受字节数

    uint32_t lastHeartbeatTick_Socket[SOCKET_PORT_NUM];  //socket心跳时间戳


};

extern cForwardServer ForwardServer;

void UartRxCplCallback(struct _Uart_TypeDef *pst_UartStruct, uint16_t uin_Size);
void UartTxCplCallback(struct _Uart_TypeDef *pst_UartStruct);
void UartErrorCallback(struct _Uart_TypeDef *pst_UartStruct);

void SendFromRingBuffer(W5500_TypeDef *pst_W5500Struct,
                                  circle_buf *p_RingBuf,
                                  uint8_t *p_TxBuff,
                                  uint16_t *p_TxSize,
                                  uint8_t uch_SocketReg);
void TCP_ProcessCommand(uint8_t *rxBuffer, uint16_t len);

#endif // __MOD_FORWARD_SERVER_H__

